Indicadores estadísticos

Encuentro 5

Paquete rstatix


El paquete rstatix simplifica el proceso de realizar análisis estadísticos complejos.

  • sintaxis intuitiva y basada en el paradigma de la “gramática de datos” de tidyverse
  • permite realizar pruebas estadísticas comunes, como t-tests, ANOVA, y correlaciones, de manera rápida y eficiente
  • diseño que facilita la integración de resultados en flujos de trabajo de análisis reproducibles, asegurando que las conclusiones derivadas de los datos sean robustas y transparentes.

Paquete rstatix

  • Muchas de sus funciones son espejos de las funciones estadísticas de R base pero compatibles con tidyverse, por lo que siempre devuelven los resultados en dataframes
library(rstatix)

datos |> 
  t_test(Edad ~ Sexo)
# A tibble: 1 × 8
  .y.   group1 group2    n1    n2 statistic    df     p
* <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl> <dbl>
1 Edad  Mujer  Varon     29    33    -0.871  59.6 0.387

Lo que nos permite conectar el resultado mediante tuberías hacia otras funciones del tidyverse, como select() o filter().

Paquete rstatix


Tiene dos funciones de resumenes para variables cuantitativas y cualitativas:

datos |> get_summary_stats(Edad, type = "mean_sd")
# A tibble: 1 × 4
  variable     n  mean    sd
  <fct>    <dbl> <dbl> <dbl>
1 Edad        62  58.6  24.5
datos |> get_summary_stats(Edad, type = "median_iqr")
# A tibble: 1 × 4
  variable     n median   iqr
  <fct>    <dbl>  <dbl> <dbl>
1 Edad        62   62.5    40

Paquete rstatix


datos |> group_by(Sexo) |> 
  get_summary_stats(Edad, type = "common")
# A tibble: 2 × 11
  Sexo  variable     n   min   max median   iqr  mean    sd    se    ci
  <chr> <fct>    <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Mujer Edad        29    18    93     57    39  55.7  23.9  4.44  9.10
2 Varon Edad        33    19    99     63    41  61.1  25.1  4.37  8.90
datos |> freq_table(Sexo)
# A tibble: 2 × 3
  Sexo      n  prop
  <chr> <int> <dbl>
1 Mujer    31  46.3
2 Varon    36  53.7

Paquete janitor


El paquete janitor tiene numerosas funciones de las cuales vamos a destacar la familia tabyl.

La función tabyl() permite crear tablas de frecuencia de una variable o tablas de contingencia para dos o más variables categóricas.

El paquete además tiene otras funciones que se enlazan con tabyl para personalizar los resultados en estas tablas (por ejemplo, agregar totales o representar frecuencias realtivas como porcentajes)

Paquete janitor


Se puede personalizar la tabla conectando por tuberías el agregado de otras funciones del paquete.

library(janitor)

datos  |>   
  tabyl(Sexo) |>  
  adorn_totals(where = "row") |>  
  adorn_pct_formatting(digits = 2) 
  Sexo  n percent
 Mujer 31  46.27%
 Varon 36  53.73%
 Total 67 100.00%

Incorporamos totales con adorn_totals() y configuramos los porcentajes con adorn_pct_formatting().

gtsummary


Este paquete permite crear tablas de resumen elegantes y personalizables que destacan las estadísticas descriptivas, resultados de modelos, y comparaciones de grupos.

Estas tablas son esenciales para reportes, publicaciones y presentaciones, asegurando que la información clave sea fácilmente comprensible.

Las salidas buscan producir estéticas compatibles con las tablas que se envían a publicar en la mayoría de las revistas científicas, así como también en otras publicaciones similares.

gtsummary


Un ejemplo de una tabla descriptiva con variables cuanti y cuali estratificada por Sexo.

flextable


Este paquete es similar a otras librerías como gt, huxtable, kableExtra, etc, que transforman las tablas y dataframes de R en salidas elegantes.

La documentación oficial dice “crear tablas flexibles y altamente personalizables en formatos de Microsoft Word, PowerPoint y HTML”.

La elección de este paquete sobre las otras opciones tiene que ver con la amplitud de opciones en la compatibilidad de los formatos de salida.

Las funciones del paquete se integran facilmente con Quarto

flextable


Una tablita que creamos anteriormente con freq_table() de rstatix fue:

datos |> freq_table(Sexo)
# A tibble: 2 × 3
  Sexo      n  prop
  <chr> <int> <dbl>
1 Mujer    31  46.3
2 Varon    36  53.7

La salida tradicional de consola se visualiza estéticamente fea.

flextable

Con flextable podemos configurar esa misma tabla, para mejorar su presentación:

library(flextable)

datos |> freq_table(Sexo) |> 
  flextable() |> 
  fontsize(size = 30, part = "all") |> 
  align(align = "center", part = "all") |> 
  line_spacing(space = 2, part = "all") |> 
  padding(padding = 6, part = "header") |> 
  set_header_labels(n = "Frecuencia", prop = "%") |> 
  theme_zebra()

Sexo

Frecuencia

%

Mujer

31

46.3

Varon

36

53.7

Funciones


Las funciones nos permiten automatizar tareas comunes de una manera más potente y general que copiar y pegar.

Funciones vectoriales que toman uno o más vectores como entrada y devuelven un vector como salida.

Funciones de tablas de datos que toman un dataframe como entrada y devuelven un dataframe como salida.

Funciones gráficas que toman un dataframe como entrada y devuelven un gráfico como salida.

Ejemplo de una función


En el material de ajuste de tasas de esta unidad, hay un momento donde creamos grupos etarios regulares cada 5 años y tenemos el problema que las etiquetas de cut_interval() no coinciden con las leídas en las proyecciones de población.

Tomamos entonces el dataframe defunciones a la altura de tener EDAD y UNIEDAD antes de construir los grupos etarios.

# A tibble: 183,814 × 4
   JURI   EDAD UNIEDAD  SEXO
   <chr> <dbl>   <dbl> <dbl>
 1 06       86       1     1
 2 06       66       1     2
 3 06       84       1     1
 4 06       90       1     2
 5 06       73       1     2
 6 06       60       1     2
 7 06       72       1     2
 8 06       77       1     2
 9 06       78       1     1
10 06       78       1     2
# ℹ 183,804 more rows

Ejemplo de una función


El código que sigue es el trabajo que hay que hacer para generar los grupos y que sean coincidentes con los grupos de las proyecciones de población.

defunciones <- defunciones |> 
  mutate(EDAD = if_else(UNIEDAD > 1,
                        true = 0,  
                        false = EDAD),                   
         GRUPEDAD = cut_interval(EDAD,
                                 length = 5,
                                 right = F),
         GRUPEDAD = as.character(GRUPEDAD),
         GRUPEDAD = str_sub(GRUPEDAD,
                            start = 2, 
                            end = str_length(GRUPEDAD)-1),
         x = str_split_fixed(GRUPEDAD, ",",
                             n = 2),
         x2 = as.numeric(x[,2])-1,
         GRUPEDAD = str_c(x[,1],"-",x2),
         GRUPEDAD = if_else(EDAD >= 80,
                            true ="80 y más", 
                            false = GRUPEDAD)) |> 
  select(!c(x, x2, EDAD, UNIEDAD))

Ejemplo de una función


Entonces podemos pensar en una función que automatice la tarea para aplicarla cada vez que la necesitemos.

grupo_5 <- function(datos, EDAD, UNIEDAD) {
  datos |> 
  mutate(EDAD = if_else({{ UNIEDAD }} > 1,
                        true = 0,  
                        false = {{ EDAD }}),                   
         GRUPEDAD = cut_interval(EDAD,
                                 length = 5,
                                 right = F),
         GRUPEDAD = as.character(GRUPEDAD),
         GRUPEDAD = str_sub(GRUPEDAD,
                            start = 2, 
                            end = str_length(GRUPEDAD)-1),
         x = str_split_fixed(GRUPEDAD, ",",
                             n = 2),
         x2 = as.numeric(x[,2])-1,
         GRUPEDAD = str_c(x[,1],"-",x2),
         GRUPEDAD = if_else(EDAD >= 80,
                            true ="80 y más", 
                            false = GRUPEDAD)) |> 
  select(!c(x, x2, EDAD, UNIEDAD))
}

Ejemplo de una función


Aplicamos la función a los datos defunciones


defunciones |> grupo_5(EDAD, UNIEDAD)
# A tibble: 183,814 × 3
   JURI   SEXO GRUPEDAD
   <chr> <dbl> <chr>   
 1 06        1 80 y más
 2 06        2 65-69   
 3 06        1 80 y más
 4 06        2 80 y más
 5 06        2 70-74   
 6 06        2 60-64   
 7 06        2 70-74   
 8 06        2 75-79   
 9 06        1 75-79   
10 06        2 75-79   
# ℹ 183,804 more rows